/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Model.dao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import Model.pojo.Cliente;
import Model.pojo.Fornecedor;
import Model.pojo.Item;

public class ItemDao implements InterfaceItemDao {
	
	private File arquivo = new File("ListaItem.txt");
	private ArrayList<Item> lista = new ArrayList<Item>();
	private String nome;
	private long codigo;
	private Fornecedor fornecedor;
	private double margemLucro;
	private double precoCusto;
	private int quantEstoque;
	private Item item;
	private FornecedorDao fornecedorDao;
	
	private FileWriter fw;
	private BufferedWriter bw;
	private FileReader fr;
	private BufferedReader br;
	Iterator<Item> it;

	public ItemDao (FornecedorDao fornecedorDao){
		this.fornecedorDao = fornecedorDao; 
	}
	
	//Le todos os Itens que estao no arquivo e coloca em uma lista.
	public ArrayList<Item> ler() throws IOException{
		if(arquivo.exists() == false){
			arquivo.createNewFile();
			return lista;
		}
		fr = new FileReader (arquivo);
		br = new BufferedReader (fr);
		while (br.ready()){
			nome = br.readLine();
			codigo = Long.parseLong(br.readLine());
			fornecedor = fornecedorDao.verificar((br.readLine()));
			margemLucro = Double.parseDouble(br.readLine());
			precoCusto = Double.parseDouble(br.readLine());
			quantEstoque = Integer.parseInt(br.readLine());
			inserir (nome, codigo,  fornecedor, margemLucro, precoCusto, quantEstoque);
		}
		br.close();
		fr.close();
		return lista;
	}
	
	public Item verificar (long codigo){
		if (lista.isEmpty() == true) return null;
		it = lista.iterator();
		while (it.hasNext()) {  
			Item aux = it.next();  
		    if (aux.getCodigo() == codigo){  
		        return aux;
		   }  
		}
		return null;
	}
	
	public Item verificar (String nome){
		if (lista.isEmpty() == true) return null;
		it = lista.iterator();
		while (it.hasNext()) {  
			Item aux = it.next();  
		    if (aux.getNome().equals(nome)){  
		        return aux;
		   }  
		}
		return null;
	}
	
	
	public void inserir (String nome, long codigo, Fornecedor fornecedor, double margemLucro, double precoCusto, int quantEstoque){
		if (fornecedor == null) return;
		item = new Item(nome, codigo, fornecedor, margemLucro, precoCusto, quantEstoque);
		lista.add(item);
	}
	
	public void adicionarFornecedor (long codigo, long codigoFornecedor){
		item = verificar(codigo);
		Iterator<Fornecedor> it2;
		it2 = item.getFornecedor().iterator();
		while (it2.hasNext()) {  
			Fornecedor aux = it2.next();  
		    if (aux.getCodigo() == codigoFornecedor){  
		        return;
		   }  
		}
		item.addFornecedor(fornecedorDao.verificar(codigoFornecedor));
		return;				
	}
	
	//Exclui um item de uma lista de itens. 
	public ArrayList<Item> excluir(long codigo) {
		if (item == null || lista.isEmpty() == true) return lista;
		it = lista.iterator();
		while (it.hasNext()) {  
			Item aux = it.next();  
		    if (aux.getCodigo() == codigo){  
		        it.remove();
		        return lista;
		   }  
		}
		return lista;	
	}
	
	public boolean alterarEstoque(long codigo, String operacao, int quantidade){
		if (verificar(codigo) == null) return false;
		if (operacao.equals("Adicionar")){
			it = lista.iterator();
			while (it.hasNext()) {  
				Item aux = it.next();  
			    if (aux.getCodigo() == codigo){  
			       	aux.setQuantEstoque(aux.getQuantEstoque()+quantidade);
			       	return true;
			   }  
			}
			return false;
		}
		if (operacao.equals("Diminuir")){
			it = lista.iterator();
			while (it.hasNext()) {  
				Item aux = it.next();  
			    if (aux.getCodigo() == codigo){  
			       	aux.setQuantEstoque(aux.getQuantEstoque()-quantidade);
			       	return true;
			   }  
			}
			return false;
		}
		return false;
	}

	public boolean alterarMargemLucro(long codigo, double margemLucro){
		if (verificar(codigo) == null) return false;
		it = lista.iterator();
		while (it.hasNext()) {  
			Item aux = it.next();  
		    if (aux.getCodigo() == codigo){  
		       	aux.setMargemLucro(margemLucro);
		       	return true;
		   }  
		}
		return false;
	}
	
	public boolean alterarPrecoCusto(long codigo, double precoCustoNovo, int quantidade){
		if (verificar(codigo) == null) return false;
		it = lista.iterator();
		while (it.hasNext()) {  
			Item aux = it.next();  
		    if (aux.getCodigo() == codigo){  
		       	aux.setPrecoCusto((aux.getQuantEstoque()*aux.getPrecoCusto()+precoCustoNovo*quantidade)/(quantidade+aux.getQuantEstoque()));
		       	return true;
		   }  
		}
		return false;
	}

	//Salva um Item no arquivo ListaItem.
	public boolean salvar(Item item) throws IOException{
		if (item == null) return false;
		fw = new FileWriter(arquivo, true);
		bw = new BufferedWriter (fw);
		bw.write(item.getNome());
		bw.newLine();
		bw.write(""+item.getCodigo());
		bw.newLine();
		bw.write(item.getFornecedor().get(0).getNome());
		bw.newLine();
		bw.write (""+item.getMargemLucro());
		bw.newLine();
		bw.write(""+item.getPrecoCusto());
		bw.newLine();
		bw.write(""+item.getQuantEstoque());
		bw.newLine();
		bw.close();
		fw.close();
		return true;
	}
	
	public boolean salvar(ArrayList<Item> lista) throws IOException{
		if (lista.isEmpty() == true) return false;
		fw = new FileWriter(arquivo);
		it = lista.iterator();
		while (it.hasNext()) {  
			Item aux = it.next();  
		    salvar(aux);
		}
		return false;
	}
	
	public ArrayList<Item> getLista() {
		return lista;
	}

	public long gerarCodigo (){
		if (lista.isEmpty() == true) return 1;
		return (lista.get(lista.size()-1).getCodigo())+1;
	}
	
	
}